package com.starsky.xjar;

import com.starsky.common.utils.SwingAwtUtils;
import com.starsky.common.utils.XjarUtils;

import javax.swing.*;
import javax.swing.text.JTextComponent;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

/**
 * @desc:xjar 加密工具，针对java开发项目jar包进行加密，jar加密后，大小会翻倍，同时swagger无法访问，接口暂时未发现问题
 * @author: wangsh
 * @time: 2024/4/5 9:34
 */
public class XjarEncryApplication {

    public static void main(String[] args) {
        createJFrame();
    }

    /**
     * 创建面板，这个类似于 HTML 的 div 标签,我们可以创建多个面板并在 JFrame 中指定位置,
     * 面板中我们可以添加文本字段，按钮及其他组件。
     */
    public static void createJFrame() {
        //创建面板
        JPanel panel = new JPanel();
        //调用用户定义的方法并添加组件到面板
        addComponents(panel);

        //创建 JFrame 实例,将panel 面板添加到 JFrame中
        SwingAwtUtils.createJFrame("xjar加密工具", 600, 400, panel);
    }

    /**
     * 调用用户定义的方法并添加组件到面板
     */
    public static void addComponents(JPanel panel) {
        //布局部分我们这边不多做介绍,这边设置布局为 null
        panel.setLayout(null);

        //创建导入excel
        //1.创建 JLabel
        panel.add(SwingAwtUtils.createLabel("选择加密的jar：", 10, 20, 120, 30));
        //2.创建文本域
        JTextField fromText = SwingAwtUtils.createTextField(20, 100, 20, 300, 30);
        panel.add(fromText);
        //3.创建选择按钮
        final JButton fromButton = SwingAwtUtils.createButton("选择", 420, 20, 80, 30);
        panel.add(fromButton);

        //创建导出excel
        //1.创建 JLabel
        panel.add(SwingAwtUtils.createLabel("选择保存位置：", 10, 50, 120, 30));
        //2.创建文本域（文本域用于记录保存路径）
        JTextField toText = SwingAwtUtils.createTextField(20, 100, 50, 300, 30);
        panel.add(toText);
        //3.创建选择按钮
        final JButton toButton = SwingAwtUtils.createButton("选择", 420, 50, 80, 30);
        panel.add(toButton);

        // 输入密码的文本域
        JLabel passwordLabel = SwingAwtUtils.createLabel("加密密码：", 10, 80, 80, 30);
        panel.add(passwordLabel);

        //这个类似用于输入的文本域,但是输入的信息会以点号代替，用于包含密码的安全性
        JPasswordField passwordText = SwingAwtUtils.createPasswordField(20, 100, 80, 300, 30);
        panel.add(passwordText);

        // 创建加密按钮
        final JButton encryptButton = SwingAwtUtils.createButton("加密", 100, 110, 80, 30);
        panel.add(encryptButton);

        // 创建解密按钮
        final JButton decryptButton = SwingAwtUtils.createButton("解密", 200, 110, 80, 30);
        panel.add(decryptButton);

        // 创建清空按钮
        final JButton cleanButton = SwingAwtUtils.createButton("清空", 280, 110, 80, 30);
        panel.add(cleanButton);

        //日志显示框
        final JTextArea textArea = SwingAwtUtils.createTextArea("日志记录：", 10, 150, 550, 150);
        panel.add(textArea);

        //选择加密jar文件按钮监听事件
        SwingAwtUtils.fileActionListener(fromButton, fromText, "jar");
        //选择输出目录按钮监听事件
        SwingAwtUtils.dirActionListener(toButton, toText);

        //选择加密按钮的监听事件
        encryptOrDecryptActionListener(encryptButton, fromText, toText, passwordText, textArea, XjarUtils.ENCRYPT);

        //选择解密按钮的监听事件
        encryptOrDecryptActionListener(decryptButton, fromText, toText, passwordText, textArea, XjarUtils.DECRYPT);

        //选择清空按钮监听事件，清空日志显示框
        JTextComponent[] texts = {fromText, toText, passwordText, textArea};
        SwingAwtUtils.cleanActionListener(cleanButton, texts);
    }


    /**
     * 加密、解密按钮的监听事件
     *
     * @param button：操作按钮
     * @param fromText：输入信息
     * @param toText：输出信息
     * @param passwordText：加密密码
     * @param textArea：日志信息文本框
     * @param encryptOrDecrypt：1-加密；2-解密
     */
    public static void encryptOrDecryptActionListener(JButton button, JTextField fromText, JTextField toText,
                                                      JPasswordField passwordText, JTextArea textArea, int encryptOrDecrypt) {
        //选择加密按钮的监听事件
        button.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                String fromJarPath = fromText.getText();
                String toJarPath = toText.getText();
                String password = new String(passwordText.getPassword());
                if (XjarUtils.checkParams(fromJarPath, toJarPath, password)) {
                    return;
                }

//                String toJarPath = toText.getText() + "\\encrypt" + getNowDateTime() + ".jar";
                toJarPath = SwingAwtUtils.getFilePath(toJarPath, SwingAwtUtils.getFileName(fromJarPath));
                //打印输入日志
                String str = XjarUtils.getOutPutLog(fromJarPath, toJarPath, password);
                System.out.println(str);
                textArea.setText(str);

                if (encryptOrDecrypt == XjarUtils.ENCRYPT) {
                    //开始加密文件
                    XjarUtils.encryptJar(fromJarPath, toJarPath, password);
                    textArea.append(" jar加密成功！\n请测试接口是否正常（注意：Swagger不可用）");
                } else {
                    //开始解密文件
                    XjarUtils.decryptJar(fromJarPath, toJarPath, password);
                    textArea.append("jar解密成功！");
                }
            }
        });

    }


}
